Sequenceウォレットの「ウォレット設定」では、アクセス制御、署名者、署名の重みを定義します。
threshold
- 署名が有効とみなされるために必要な「重みの合計」です。checkpoint
- ウォレットの更新時のソルトや順序管理に使用されます。tree
- ウォレットの署名者とその重みを決定します。threshold
はuint16
型で、0から65535までの値を取ります。署名者の重みの合計がthreshold以上の場合のみ、署名は有効とみなされます。
checkpoint
はuint32
型です。ウォレット作成時に、同じ初期設定で独立したウォレットを生成するために半ランダムな値を指定できます。通常運用時は、Light State Syncによってウォレット更新が正しい順序で適用されるようにcheckpoint
が使われます。
tree
はアンバランスなバイナリMerkleツリーで、各リーフには署名者、静的署名、またはサブツリーが含まれます。このツリーにより、あらゆる組み合わせの署名者と重みを表現でき、複雑なマルチシグウォレットの作成も可能です。
リーフの種類は以下の通りです。
address
とuint8
の重みで表されます。重みは、その署名者がthresholdにどれだけ貢献するかを示します。
アドレスはERC1271
準拠のコントラクトまたはEOA
ウォレットのいずれかです。
リーフハッシュは以下のように計算されます。
Infinity
となります。
ネストされたツリー内に存在する静的サブダイジェストは、その「Infinity」重みがネストされたツリーの重みに減少します。
リーフハッシュは以下のように計算されます。
weight
(uint8
)threshold
(uint16
)tree
internal threshold
に達する署名があれば有効とみなされ、external weight
が親ツリーに加算されます。ネストされた設定はいくつでも作成でき、複数階層のネストも可能です。
このパターンは、例えば、以下のようなシナリオを表現する際に利用できます。
threshold == 0
やthreshold > total weight
のような設定は、完全に認証されないウォレットやアクセス不能なウォレットを生み出すことになります。configuration
全体が保存されることはなく、Merkleツリーを単一のbytes32
値にハッシュ化します。これを内部的に設定のimageHash
と呼びます。
imageHash
は以下のように計算されます。
hashTree
関数はツリー全体を再帰的にハッシュ化して単一のbytes32
値にします。hashTree
関数の擬似コードは以下の通りです。
CREATE2
デプロイ時に初期設定のimageHash
をSALTとして使用します。
ウォレットはFactory
コントラクトのdeploy
関数を呼び出してデプロイされます。この関数には以下のパラメータを指定します。
mainModule
: ウォレットの初期コード実装のアドレス。salt
: 初期設定のimageHash
。MainModule
を使用してください。MainModule
は(署名検証時に)imageHash
を再計算してカウンターファクチュアルアドレスを検証するため、ストレージの初期化は不要です。もしimageHash
が変更された場合、MainModule
は自動的にウォレットのコード実装をMainModuleUpgradeable
に置き換え、ストレージの初期化も行います。